package com.ruoyi.ldzlsb.util;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

/**
 * 文件上传工具类
 */
public class FileUploadUtil {
    
    private static final Logger log = LoggerFactory.getLogger(FileUploadUtil.class);
    
    // 默认的图片上传路径
    private static final String DEFAULT_IMAGE_PATH = "/Users/mryan/Pictures/equipment-images";
    
    /**
     * 上传文件
     * @param file 文件
     * @return 文件访问URL
     * @throws IOException
     */
    public static String uploadFile(MultipartFile file) throws IOException {
        return uploadFile(file, DEFAULT_IMAGE_PATH, "equipment");
    }
    
    /**
     * 上传文件，指定前缀
     * @param file 文件
     * @param filePrefix 文件名前缀(equipment 或 fault)
     * @return 文件访问URL
     * @throws IOException
     */
    public static String uploadFile(MultipartFile file, String filePrefix) throws IOException {
        return uploadFile(file, DEFAULT_IMAGE_PATH, filePrefix);
    }
    
    /**
     * 上传文件到指定目录
     * @param file 文件
     * @param uploadDir 上传目录
     * @param filePrefix 文件名前缀
     * @return 文件访问URL
     * @throws IOException
     */
    public static String uploadFile(MultipartFile file, String uploadDir, String filePrefix) throws IOException {
        if (file.isEmpty()) {
            throw new IOException("上传文件为空");
        }
        
        // 检查文件类型
        String extension = FilenameUtils.getExtension(file.getOriginalFilename());
        if (!isValidImageExtension(extension)) {
            throw new IOException("不支持的文件类型: " + extension);
        }
        
        // 检查文件大小
        if (file.getSize() > 1024 * 1024 * 5) { // 5MB
            throw new IOException("文件大小超过限制");
        }
        
        // 创建目录
        File directory = new File(uploadDir);
        if (!directory.exists()) {
            directory.mkdirs();
        }
        
        // 生成唯一的文件名
        String fileName = generateUniqueFileName(extension, filePrefix);
        
        // 构建文件路径
        File dest = new File(uploadDir + File.separator + fileName);
        
        try {
            // 保存文件
            file.transferTo(dest);
            log.info("文件保存成功: {}", dest.getAbsolutePath());
            
            // 返回文件访问路径
            return "equipment-images/" + fileName;
        } catch (IOException e) {
            log.error("文件保存失败", e);
            throw e;
        }
    }
    
    /**
     * 生成唯一的文件名
     * @param extension 文件扩展名
     * @param filePrefix 文件前缀
     * @return 唯一文件名
     */
    private static String generateUniqueFileName(String extension, String filePrefix) {
        // 使用日期和UUID生成唯一文件名
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String dateStr = sdf.format(new Date());
        String uuid = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 8);
        
        return filePrefix + "_" + dateStr + "_" + uuid + "." + extension;
    }
    
    /**
     * 验证是否是有效的图片扩展名
     * @param extension 扩展名
     * @return 是否有效
     */
    private static boolean isValidImageExtension(String extension) {
        if (StringUtils.isBlank(extension)) {
            return false;
        }
        
        String[] allowedExtensions = {"jpg", "jpeg", "png", "gif", "bmp"};
        for (String ext : allowedExtensions) {
            if (ext.equalsIgnoreCase(extension)) {
                return true;
            }
        }
        
        return false;
    }
}
